import axios from "axios";
import { createUniAppAxiosAdapter } from "@uni-helper/axios-adapter";
import { network } from "@/config/network";
import { getToken,removeToken } from "@/utils/token";
import { clearEmptyParam, toRawType } from "@/utils";
axios.defaults.adapter = createUniAppAxiosAdapter();

// 网络配置
const { baseURL, contentType, requestTimeout, messageDuration } = network;

// 是否正在刷新登录
let isRefreshingToken = false

// 创建实例
const instance = axios.create({
  baseURL,
  timeout: requestTimeout,
  headers: {
    "Content-Type": contentType,
  },
});

// 请求拦截
instance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    if (!config.notLoading) {
      uni.showLoading();
    }
    // 处理token
    const token = getToken();

    if (token) {
      config.headers["X-ACCESS-TOKEN"] = token;
      isRefreshingToken = false
    }

    if(isRefreshingToken){
      return
    }

    if (!config.noClearFlag) {
      clearEmptyParam(config);
      console.log("去除空值后的参数", config);
    }

    // 处理get请求的搜索参数
    if (
      config?.params?.search &&
      toRawType(config.params.search) === "Object"
    ) {
      // 将 search 对象转为 JSON 字符串
      config.params.search = JSON.stringify(config.params.search);
    }

    console.debug(
      "[api] ===>",
      config.method,
      config.url,
      config.params || config.data || {}
    );
    return config;
  },
  (error) => {
    uni.hideLoading();
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 响应拦截
instance.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    uni.hideLoading();
    console.debug(
      "[api] <===",
      response.config.method,
      response.config.url,
      response.data
    );
    // 对响应数据做点什么
    const res = response.data;
    return res;
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    uni.hideLoading();
    console.log('错误',error)
    // 对响应错误做点什么
    if (error && !error.response && error.message === "Network Error") {
      // 网络请求失败
      console.debug("request failed", "网络请求失败");
      uni.showToast({
        title: "网络请求失败",
        duration: messageDuration,
        icon: "none",
      });
      return Promise.reject(error);
    } else if (error.response.status === 401) {
      // 未登录或者登录失败处理
      console.debug("[api] 未登录或者登录失败，正在重新登录");
      uni.showToast({
        title: "未登录或者登录失败，正在重新登录",
        duration: messageDuration,
        icon: "none",
      });
      isRefreshingToken = true
      removeToken();
      uni.redirectTo({
        url: "/pages/login/index",
      })
      return Promise.reject(error);
    } else if (error.response.status === 403) {
      // 权限不足处理
      console.debug("[api] 权限不足处理");
      uni.showToast({
        title: "权限不足，正在重新登录",
        duration: messageDuration,
        icon: "none",
      });
      isRefreshingToken = true
      removeToken();
      uni.redirectTo({
        url: "/pages/login/index",
      })
      return Promise.reject(error);
    } else {
      // 仅提示
      console.error("request failed", JSON.stringify(error));
      const msg =
        error.response.data.msg ||
        error.response.data.message ||
        "请求数据失败,请稍后再试";
      uni.showToast({
        title: msg,
        duration: messageDuration,
        icon: "none",
      });
      return Promise.reject(error);
    }
  }
);

export default instance;
